<?php
defined('_IN_CMS') or die('Fuck off');

class Statistics extends Db
{
    use browser, data, face, pagination, rights;
    
    /* Настройки для статистики */
    /*public $from       = 0;    // От
    public $to         = 24;   // До
    public $pp         = 24;   // Записей на страницу
    public $pages      = 1;    // Всего страниц
    public $cur_page   = 1;    // Текущая страница
    */
    private $errors; // для сообщений об ошибках
    private $data; // Массив для данных

    public $ua         = 'X3'; // User-Agent
    public $os         = 'X3'; // ОС посетителя по умолчанию
    public $ref        = '';   // Реферер
    public $ref_text   = '';   // Текст ссылки на реферер
    public $ip_filter  = '';
    public $ua_filter  = '';
    public $os_filter  = '';
    public $ref_filter = '';
    public $req_filter = '';
    
    public  $sql;
    public  $link;

    private $_agent = '';
    private $_browser_name = '';
    private $_version = '';
    private $_platform = '';
    private $_os = '';
    private $_is_aol = false;
    private $_is_mobile = false;
    private $_is_robot = false;
    private $_aol_version = '';
    public  $useragent = '';

    const BROWSER_UNKNOWN = 'unknown';
    const VERSION_UNKNOWN = 'unknown';

    const BROWSER_OPERA = 'Opera';                            // http://www.opera.com/
    const BROWSER_OPERA_MINI = 'Opera Mini';                  // http://www.opera.com/mini/
    const BROWSER_WEBTV = 'WebTV';                            // http://www.webtv.net/pc/
    const BROWSER_IE = 'IE';                                  // http://www.microsoft.com/ie/
    const BROWSER_POCKET_IE = 'Pocket Internet Explorer';     // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile
    const BROWSER_KONQUEROR = 'Konqueror';                    // http://www.konqueror.org/
    const BROWSER_ICAB = 'iCab';                              // http://www.icab.de/
    const BROWSER_OMNIWEB = 'OmniWeb';                        // http://www.omnigroup.com/applications/omniweb/
    const BROWSER_FIREBIRD = 'Firebird';                      // http://www.ibphoenix.com/
    const BROWSER_FIREFOX = 'Firefox';                        // http://www.mozilla.com/en-US/firefox/firefox.html
    const BROWSER_ICEWEASEL = 'Iceweasel';                    // http://www.geticeweasel.org/
    const BROWSER_SHIRETOKO = 'Shiretoko';                    // http://wiki.mozilla.org/Projects/shiretoko
    const BROWSER_MOZILLA = 'Mozilla';                        // http://www.mozilla.com/en-US/
    const BROWSER_AMAYA = 'Amaya';                            // http://www.w3.org/Amaya/
    const BROWSER_LYNX = 'Lynx';                              // http://en.wikipedia.org/wiki/Lynx
    const BROWSER_SAFARI = 'Safari';                          // http://apple.com
    const BROWSER_IPHONE = 'iPhone';                          // http://apple.com
    const BROWSER_IPOD = 'iPod';                              // http://apple.com
    const BROWSER_IPAD = 'iPad';                              // http://apple.com
    const BROWSER_CHROME = 'Chrome';                          // http://www.google.com/chrome
    const BROWSER_ANDROID = 'Android';                        // http://www.android.com/
    const BROWSER_GOOGLEBOT = 'GoogleBot';                    // http://en.wikipedia.org/wiki/Googlebot
    const BROWSER_SLURP = 'Yahoo! Slurp';                     // http://en.wikipedia.org/wiki/Yahoo!_Slurp
    const BROWSER_W3CVALIDATOR = 'W3C Validator';             // http://validator.w3.org/
    const BROWSER_BLACKBERRY = 'BlackBerry';                  // http://www.blackberry.com/
    const BROWSER_ICECAT = 'IceCat';                          // http://en.wikipedia.org/wiki/GNU_IceCat
    const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser';        // http://en.wikipedia.org/wiki/Web_Browser_for_S60
    const BROWSER_NOKIA = 'Nokia Browser';                    // * all other WAP-based browsers on the Nokia Platform
    const BROWSER_MSN = 'MSN Browser';                        // http://explorer.msn.com/
    const BROWSER_MSNBOT = 'MSN Bot';                         // http://search.msn.com/msnbot.htm
                                                              // http://en.wikipedia.org/wiki/Msnbot  (used for Bing as well)
    const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator';  // http://browser.netscape.com/ (DEPRECATED)
    const BROWSER_GALEON = 'Galeon';                          // http://galeon.sourceforge.net/ (DEPRECATED)
    const BROWSER_NETPOSITIVE = 'NetPositive';                // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED)
    const BROWSER_PHOENIX = 'Phoenix';                        // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED)

    const PLATFORM_UNKNOWN = 'unknown';
    const PLATFORM_WINDOWS = 'Windows';
    const PLATFORM_WINDOWS_CE = 'Windows CE';
    const PLATFORM_APPLE = 'Apple';
    const PLATFORM_LINUX = 'Linux';
    const PLATFORM_OS2 = 'OS/2';
    const PLATFORM_BEOS = 'BeOS';
    const PLATFORM_IPHONE = 'iPhone';
    const PLATFORM_IPOD = 'iPod';
    const PLATFORM_IPAD = 'iPad';
    const PLATFORM_BLACKBERRY = 'BlackBerry';
    const PLATFORM_NOKIA = 'Nokia';
    const PLATFORM_FREEBSD = 'FreeBSD';
    const PLATFORM_OPENBSD = 'OpenBSD';
    const PLATFORM_NETBSD = 'NetBSD';
    const PLATFORM_SUNOS = 'SunOS';
    const PLATFORM_OPENSOLARIS = 'OpenSolaris';
    const PLATFORM_ANDROID = 'Android';
    
    const OPERATING_SYSTEM_UNKNOWN = 'unknown';

    public function __construct()
    {
        $this->sql = '';
        $this->reset();
        $this->determine();
    }

    public function addRecord(&$user)
    {
        if (!isset($_GET['deleted']) && !isset($_GET['deleteItem'])) {
            $user->ip  = $_SERVER['REMOTE_ADDR'];         // IP-адрес посетителя
            $user->ua = (isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
            $user->ref = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
            $user->req = $_SERVER['REQUEST_URI'];         // Запрашиваемый адрес
            $user->server_name = $_SERVER['SERVER_NAME']; // К примеру, bydlocms.org
            $this->sql = "INSERT INTO `".Db::$table_name['statistics']."` 
                (`ip`, `ua`, `user`, `ref`, `req`) VALUES 
                ('".$user->ip."', '".$user->ua."', '".$user->id."', '".$user->ref."', '".$user->req."') --";
            self::db_query($this->sql);
            $_SESSION['pages_count'] = (!isset($_SESSION['pages_count'])) ? 1 : (int)$_SESSION['pages_count']+1;
        }
    }

    public function emptyStatistics(&$user)
    {
        if ((self::can($user, 1)) || (self::can($user, 15))) {
            $stat = self::db_query("TRUNCATE TABLE `statistic00` --");
            echo 'Статистика очищена <META HTTP-EQUIV="Refresh" CONTENT="0; URL=/statistics/deleted">';
        } else {
            $this->errors[] = 'Нет прав для очистки статистики';
            echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=statistics/deleted">';
        }
    }

    public function showStatistics(&$user)
    {
        if ((self::can($user, 1)) || (self::can($user, 14))) {
            // Если есть права на просмотр статистики
            $stat_status = self::db_query("Show TABLE STATUS LIKE 'statistic00' --"); //Состояние таблицы
            $this->count = (int)mysql_result($stat_status, 0, 'Rows'); //Количество записей
            if ($this->count < $this->to) {
                // Если количество записей меньше, чем выбранный диапазон для показа,
                // то приравниваем эти значения в меньшую сторону
                $this->to = $this->count;    
            } else {
                $this->pages = ceil($this->count/$this->pp); // Количество страниц, округление в большую сторону
            }

            if (isset($_GET['page'])) {
                // Параметр - номер страницы
                $this->cur_page = abs((int)$_GET['page']);
                $this->from = ($this->cur_page*$this->pp)-$this->pp;
                $this->to = $this->from + $this->pp;
            }
            
            $this->ip_filter  = '';
            $this->ua_filter  = '';
            $this->os_filter  = '';
            $this->ref_filter = '';
            $this->req_filter = '';
            
            if (isset($_POST['ip_filter'])) {
                // Фильтрация IP, оставляем только точки
                // Количество точек или символов не имеет значения, так как может фильтроваться(поиск по БД) и часть запроса
                if (!empty($_POST['ip_filter'])) $this->ip_filter = str_replace('[^0-9.]', '', $_POST['ip_filter']);
            }
            if (isset($_POST['ua_filter'])) {
                if (!empty($_POST['ua_filter'])) $this->ua_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['ua_filter']);
            }
            if (isset($_POST['os_filter'])) {
                if (!empty($_POST['os_filter'])) $this->s_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['os_filter']);
            }
            if (isset($_POST['ref_filter'])) {
                if (!empty($_POST['ref_filter'])) $this->ref_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['ref_filter']);
            }
            if (isset($_POST['req_filter'])) {
                if (!empty($_POST['req_filter'])) $this->req_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['req_filter']);
            }
            
            if (isset($_POST['reset'])) {
                // Сброс фильтра
                $this->ip_filter  = '';
                $this->ua_filter  = '';
                $this->os_filter  = '';
                $this->ref_filter = '';
                $this->req_filter = '';
            }

            $this->sql_ua  = " `ua`  LIKE '%$this->ua_filter%'";         // Такой
            $this->sql_os  = "AND `ua`  LIKE '%$this->os_filter%'";     // Вот
            $this->sql_ip  = "AND `ip`  LIKE '%$this->ip_filter%'";    // Ужасный
            $this->sql_ref = "AND `ref` LIKE '%$this->ref_filter%'";  // Индусский
            $this->sql_req = "AND `ref` LIKE '%$this->req_filter%'"; // Код
            // А в этот запрос мы вставляем строки с тем, что нужно отфильтровать
            $this->query = "SELECT `statistic00`.`id`, `date`, `ip`, `ua`, `user`, `ref`, `req`, 
                `users00`.`id`, `users00`.`login`
                FROM `statistic00`, `users00` WHERE
                `statistic00`.`user` = `users00`.`id` AND
                $this->sql_ua
                $this->sql_os
                $this->sql_ip
                $this->sql_ref
                $this->sql_req
                ORDER BY `statistic00`.`id` DESC
                LIMIT $this->from, $this->to --";
            
            if (isset($_GET['empty'])) {
                $this->emptyStatistics();
            } else {
                $this->stat = self::db_query($this->query);
                // Выводим номера страниц
                $this->printPagination();
                $this->pp = mysql_num_rows($this->stat);
                if ($this->cur_page >= 2) {
                    if ($this->pp <= 0) {
                        echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/statistics/deleted/page='.--$this->cur_page.'">';
                    }
                }
                $this->data[0]['from'] = $this->from;
                $this->data[0]['to'] = $this->to;
                $this->data[0]['pp'] = $this->pp;
                $this->data[0]['pages'] = $this->pages;
                $this->data[0]['cur_page'] = $this->cur_page;

                for ($i = 0; $i < $this->pp; $i++) {
                    $this->data[$i]['id'] = mysql_result($this->stat, $i, "statistic00.id");
                    $this->data[$i]['date'] = mysql_result($this->stat, $i, "statistic00.date");
                    $this->data[$i]['req'] = mysql_result($this->stat, $i, "statistic00.req");
                    $this->data[$i]['ref'] = mysql_result($this->stat, $i, "statistic00.ref");
                    $this->data[$i]['ip'] = mysql_result($this->stat, $i, "statistic00.ip");
                    $this->ua = mysql_result($this->stat, $i, "statistic00.ua");
                    $this->setUserAgent($this->ua);
                    $this->data[$i]['ua'] = strtolower($this->getBrowser());
                    $this->data[$i]['os'] = strtolower($this->getPlatform());
                    $this->data[$i]['user_id'] =  mysql_result($this->stat, $i, "users00.id");
                    $this->data[$i]['user_login'] = mysql_result($this->stat, $i, "users00.login");
                }
                $this->showStatisticsFace($this->data);
                $this->printPagination();
            }
        } else {
            $this->errors[] = 'Ты не можешь просматривать статистику';
            $this->printError($this->errors);
        }
    }

    public function deleteRecord(&$user)
    {
        // Удаление записи в статистике
        // Передаём параметр - номер записи
        if ((self::can($user, 1)) || (self::can($user, 15))) {
            // Если SVI
            // Если может очищать статистику
            //if (isset($_GET['fp'])) $fp = (int)$_GET['fp']; // С какой страницы пришли, чтобы на неё вернуться
            $delete = (int)$_GET['deleteItem'];
            // Удаляем запись из статистики
            self::db_query("DELETE FROM `statistic00` WHERE `id` = '$delete' --");
            // Возвращаемся туда, откуда пришли
            //echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=statistics/page='.$fp.'">';
            echo 'ok';
        } else {
            // Если не авторизованы или ещё что
            $this->printError('Ты не можешь удалять записи в статистике');
            echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/">';
        }
    }
    
    public function getOnline()
    {
        // Счетчик посетителей онлайн
        $realtime = (time() + $sdvigclock * 3600) - 300;
        $users = (int)mysql_result(mysql_query("SELECT COUNT(*) FROM `users00` WHERE `date_last_visit` > '$realtime'"), 0);
        return $users; 
    }

}

?>
